<?php 
// trait UserInfo {
//     function getReturnType(){
//         return 'TYPE';
//     }
//     function getReturnDescription(){
//         return 'DESC';
//     }
// }

// class UserMethod extends ReflectionMethod {
//     use UserInfo;
// }

// class UserFunction extends ReflectionFunction{
//     use UserInfo ;
// }
/***********************************************************************/
// class Base {
//     public function sayHello() {
//         echo 'Hello ';
//     }
// }

// trait SayWorld{
//     public function sayHello(){
//         parent::sayHello();        
//         echo 'World';
//     }
// }

// class MyHelloWorld extends Base {
//     use SayWorld;
// }
    
// $o = new MyHelloWorld();
// $o->sayHello();
//从基类继承的成员被插入的 SayWorld Trait 中的 sayHello 方法所覆盖。其行为 MyHelloWorld 类中定义的方法一致。优先顺序是当前类中的方法会覆盖 trait 方法，而 trait 方法又覆盖了基类中的方法。

/**********************************************************************/

// trait Hello {
//     public function sayHello(){
//         echo 'Hello';
//     }
// }
// trait World {
//     public function sayWorld(){
//         echo 'World';
//     }
// }
// class MySayHelloWorld {
//     use Hello,World;
//     public function say(){
//         echo '!';
//     }
// }

// $oo = new MySayHelloWorld();
// $oo->sayHello();
// $oo->sayWorld();
// $oo->say();
//通过逗号分隔，在 use 声明列出多个 trait，可以都插入到一个类中。
/**********************************************************************/

trait A{
    public function smallTalk(){
        echo 'a';
    }
    public function bigTalk(){
        echo 'A';
    }
}

trait B{
    public function smallTalk(){
        echo 'b';
    }
    public function bigTalk(){
        echo 'B';
    }
}

class Talker{
    use A,B{
        B::smallTalk insteadof A;
        A::smallTalk insteadof B;
    }
}

class Aliased_Talker {
    use A, B {
        B::smallTalk insteadof A;
        A::bigTalk insteadof B;
        B::bigTalk as talk;
    }
}


?>